#include"mystdio.h"



myFILE *mfopen(const char *path, const char *mode) {
    myFILE *fp = (myFILE *)malloc(sizeof(myFILE));
    if (fp == NULL) {
        perror("malloc(sizeof(myFILE))");
        return NULL;
    }
    fp->buf[0] = '\0';  // 假设 buf 是字符串缓冲区
    fp->size=0;//缓存区字符个数

    int flags = 0;
    mode_t permissions = 0777;

    if (strcmp(mode, "w") == 0) {
        flags = O_WRONLY | O_CREAT | O_TRUNC;
    } else if (strcmp(mode, "a") == 0) {
        flags = O_WRONLY | O_CREAT | O_APPEND;
    } else if (strcmp(mode, "r") == 0) {
        flags = O_RDONLY;
    } else {
        fprintf(stderr, "Invalid mode: %s\n", mode);
        free(fp);
        return NULL;
    }

    fp->fd = open(path, flags, permissions);
    if (fp->fd == -1) {
        perror("open");
        free(fp);
        return NULL;
    }

    return fp;
}


int mfflush(myFILE * stream)
{
    write(stream->fd,stream->buf,stream->size);
    stream->size=0;
}


size_t mfread(void *ptr,size_t size, size_t nmemb,myFILE * stream)
{
    return read(stream->fd,ptr,size*nmemb);
}
size_t mfwrite(const void* ptr,size_t size, size_t nmemb,myFILE * stream)
{
    if(stream->size+size*nmemb>1024)
        mfflush(stream);
    snprintf(stream->buf+stream->size,size*nmemb,"%s",(char*)ptr);
    stream->size+=size*nmemb;

    return size*nmemb;
}















// #include<stdio.h>
// #include<unistd.h>
// #include <fcntl.h>
// #include<string.h>



























// int main()
// {

//     int fd=open("log.txt",O_TRUNC| O_WRONLY|O_CREAT, 0777);
//     dup2(fd,1);

//     char s1[]="aaaaaaaaaaa\n";
//     char s2[]="bbbbbbbbbbb\n";

//     write(fd,s1,strlen(s1));
//     write(1,s2,strlen(s2));//此时fd与1都指向log文件

//     return 0;
// }

// int main()
// {
//     //先关闭标准输出
//     close(1);
//     //再打开文件
//     FILE * fp=fopen("log.txt","w+");//以读写方式打开

//     printf("文件fd为:%d\n",fp->_fileno);

//     fflush(stdout);
//     sync();
//     rewind(fp);//使文件下标回到开始

//     char s[1024]="\0";
//     fscanf(fp,"%s",s);    
//     perror(s);//我们只关闭了标准输出，标准错误依然是正常的，可以向屏幕打印


//     return 0;
// }

